
//{{{ file documentation -------------------------------------------------------

/*!
 * @file     tools.cpp
 * @brief    dicodor tools class implementation
 */

//}}} --------------------------------------------------------------------------
//{{{ includes / predeclarations -----------------------------------------------

// @(#) $Id:$

#include "tools.h"

#include <QtCore/QFile>
#include <QtCore/QProcess>
#include <QtCore/QFileInfo>
#include <QtCore/QEventLoop>
#include <QtCore/QTimer>

//}}} --------------------------------------------------------------------------
//{{{ bool Tools::fileCopyByBlocks( const QString & srcName, const QString & dstName, const int bufferSize ) -

// ns: restored

bool Tools::fileCopyByBlocks (const QString& srcName, const QString& dstName, const int bufferSize)
{
	QFile src (srcName);
	if (!src.exists ()) {
		// source à copier n'existe pas
		return false;
	}
	if (!src.open (QIODevice::ReadOnly)) {
		// peux pas ouvrir source
		return false;
	}

	QFile dst (dstName);
	if (dst.exists ()) {
		// destination existe déjà
		return false;
	}
	if (!dst.open (QIODevice::Append)) {
		// peux pas ouvrir destination
		return false;
	}

	qint64 bytesToRead = src.size ();			// nbre d'octets à lire en tout
	if (bytesToRead > qint64 (2147483647)) {
		// faire quelque chose, la taille d'un int est dépassée
	}

	for (qint64 bytesReadTotal = 0 ; !src.atEnd () ;) {
		QByteArray buffer (src.read (bufferSize));
		bytesReadTotal += buffer.size ();   // bytesReadTotal = avancement de l'opération

		dst.write (buffer);
		if (src.error () || dst.error ()) {
			// il y a une erreur, vérifier
			return false;
		}
	}

	return true;
}

//}}} --------------------------------------------------------------------------
//{{{ bool Tools::fileType (const QString &path)

QString Tools::fileType (const QString &path)
{

#if (defined (Q_OS_LINUX) || defined (Q_OS_MAC))
	QString command (QString ("file -b --mime \"%1\"").arg (path));
	return shell (command);
#else
	QFileInfo fi (path);
	if (fi.completeSuffix () == "txt") return QString ("text");
	if (fi.completeSuffix () == "html") return QString ("html");
#endif

}

//}}} --------------------------------------------------------------------------
//{{{ QString Tools::shell (const QString& cmdLine)

QString Tools::shell (const QString& cmdLine)
{
	QProcess process;
	process.start (cmdLine);
	process.waitForFinished ();

	return (process.exitCode () == 0) ? QString (process.readAllStandardOutput ()) : QString ();
}

//}}} --------------------------------------------------------------------------
//{{{ QString Tools::environmentValue (const QString & name)

QString Tools::environmentValue (const QString & name)
{
	QProcessEnvironment env (QProcessEnvironment::systemEnvironment ());
	return env.value (name);
}
//}}} --------------------------------------------------------------------------
//{{{ void Tools::setEnvironmentValue (const QString & name, const QString & value)

void Tools::setEnvironmentValue (const QString & name, const QString & value)
{
	QProcessEnvironment env (QProcessEnvironment::systemEnvironment ());
	env.insert (name, value);
}
//}}} --------------------------------------------------------------------------
//{{{ Tools::userAgrees(const QString &text)

bool Tools::userAgrees(const QString &text)
{
	int answer = QMessageBox::warning (0,
									   QObject::tr ("Attention.."),
									   text,
									   QMessageBox::Ok | QMessageBox::Cancel,
									   QMessageBox::Cancel);
	return answer == QMessageBox::Ok;
}


//---------------------------
QString Tools::DEName ()
// retourne le nom du bureau si trouvé dans les variables d'environnement de l'appli
{
	QString result ("unknown");

	// chaque variable d'environnement est sous la forme key=value
	// ici on cherche key=DESKTOP_SESSION et value= (02GNOME, 06xfce4, etc...)
	QString desktop  ("DESKTOP_SESSION=");
	int start = desktop.length ();	// à partir du signe égal
	foreach  (QString env, QProcess::systemEnvironment ())
	{
		if  (env.startsWith (desktop))
		{
			result = env.mid (start);
			break;
		}
	}

	return result;
}
//----------------------------
/**
 * @brief Tools::wait
 * @param ms
 */
void Tools::wait (int ms)
{
	QEventLoop eventLoop;
	QTimer::singleShot (ms, &eventLoop, SLOT (quit ()));
	eventLoop.exec ();
}
//--------------------------------------
/**
 * @brief Tools::getenv
 * @param var
 * @return
 */
QString Tools::getenv (QString var)
{
	if  (!var.endsWith ('='))
		var += '=';

	QString result;

	// récupère l'environnement sous forme de liste de chaînes
	QStringList env ( QProcess::systemEnvironment () );

	foreach  ( QString chaine, env ) // puis le parcourt
	{
		if  (chaine.startsWith (var)) // la chaîne d'environnement débute par "<var>="
		{
			result = chaine.mid (var.size ());	// prend tout ce qui est après le signe '='
			break;
		}
	}

	return result;
}
//--------------------------------
/**
 * @brief Tools::getUserName
 * @return
 */
QString Tools::getUserName ()	// le nom de la session de l'utilisateur
{
	QString name = getenv ("USER");
	if  (name.isEmpty ())
		name = QObject::tr ("Moi");
	return name;
}






